package io.zhiller.storagedemo.di

import android.content.Context
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import io.zhiller.storagedemo.data.constants.RoomConfig
import io.zhiller.storagedemo.storage.dao.NoteDAO
import io.zhiller.storagedemo.storage.db.RoomDB
import io.zhiller.storagedemo.storage.repo.NoteRepo
import io.zhiller.storagedemo.storage.repo.NoteRepoImpl
import kotlinx.coroutines.CoroutineScope
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module

val dbModule = module {
  single { provideRoomDatabase(androidContext(), get()) }
  single { providerNoteDAO(get()) }

  single<NoteRepo> { NoteRepoImpl(get()) }
}

/**
 * 提供Room数据库实例
 *
 * @param context Android上下文，用于构建数据库
 * @param scope 协程作用域，用于初始化数据库
 * @return 返回一个RoomDB实例
 *
 * 此函数负责构建并返回一个Room数据库实例它包括数据库的配置和初始化逻辑
 */
fun provideRoomDatabase(context: Context, scope: CoroutineScope): RoomDB {
  var database: RoomDB? = null

  // 构建Room数据库实例
  database = Room.databaseBuilder(context, RoomDB::class.java, RoomConfig.DB_NAME)
    .addCallback(object : RoomDatabase.Callback() {
      /**
       * 数据库创建时调用
       *
       * @param db SupportSQLiteDatabase实例
       *
       * 在数据库创建后，初始化数据库并填充必要数据
       */
      override fun onCreate(db: SupportSQLiteDatabase) {
        super.onCreate(db)
        RoomDB.initialize(scope = scope, database = database)
      }
    })
    .fallbackToDestructiveMigration() // 当数据库模式改变时，销毁并重建数据库
    .build() // 构建数据库实例
  return database
}


private fun providerNoteDAO(roomDB: RoomDB): NoteDAO {
  return roomDB.getNoteDao()
}